#ifndef CtrlStdH
#define CtrlStdH

#ifdef _CTRLSTD_BPL
  #define PACKAGE_CTRLSTD __declspec( dllexport)
#else
  #define PACKAGE_CTRLSTD __declspec( dllimport)
#endif

#define PROG_COL_EDIT                   clWindow
#define PROG_COL_OBLIGATOIRE            (TColor)RGB(255,150,150)
#define PROG_COL_OBLIGATOIRE_READONLY   (TColor)RGB(200,150,150)
#define PROG_COL_DISABLED               clBtnFace
#define PROG_COL_BLEUSIHINT             clAqua


typedef bool __fastcall (__closure* TCorrectementRempliEvent)( TWinControl* pedSender);

template <class T> void __fastcall RafraichirFond(T *t)
{
  TColor CouleurFond = PROG_COL_EDIT;

  //Si la couleur du fond sélectionnée n'est pas standard => On la conserve
  if (   t->Color != PROG_COL_EDIT                
      && t->Color != PROG_COL_OBLIGATOIRE && t->Color != PROG_COL_OBLIGATOIRE_READONLY
      && t->Color != PROG_COL_DISABLED    && t->Color != PROG_COL_BLEUSIHINT)
   CouleurFond = t->Color;
  else
  {
    if(!t->Enabled || (t->ReadOnly && !t->Obligatoire))
      CouleurFond = PROG_COL_DISABLED;
    else
    {
      if( t->Obligatoire &&
          ( (!t->OnEstCorrectementRempli && !t->EstCorrectementRempliDefault() ) ||
            ( t->OnEstCorrectementRempli && !t->OnEstCorrectementRempli(t)     )    ) )
      {
        if( t->ReadOnly) CouleurFond = PROG_COL_OBLIGATOIRE_READONLY;
        else             CouleurFond = PROG_COL_OBLIGATOIRE;
      }
      else if( t->ReadOnly)                                                             CouleurFond = PROG_COL_DISABLED;
      else if( t->BleuSiHint && !t->Hint.IsEmpty() && t->ShowHint &&
          ( (!t->OnEstCorrectementRempli && !t->EstCorrectementRempliDefault() ) ||
            ( t->OnEstCorrectementRempli && !t->OnEstCorrectementRempli(t)     )    ) ) CouleurFond = PROG_COL_BLEUSIHINT;
      else                                                                              CouleurFond = PROG_COL_EDIT;
    }
  }

if (   t->ClassNameIs("CDBComboBox")
    || t->ClassNameIs("CDBListBox")
    || t->ClassNameIs("CDBMemo")
    || t->ClassNameIs("CDBEdit")
    || t->ClassNameIs("CRichEdit"))
   t->Color = CouleurFond;   //Moins propre que l'affectation du Brush, mais les composants DB se redessinent tout seul lorsque l'enregistrement change
else
   t->Brush->Color = CouleurFond;
t->Repaint();
}

template <class T> void __fastcall RafraichirFondSansObligatoire(T *t)
{
  TColor CouleurFond = PROG_COL_EDIT;

  //Si la couleur du fond sélectionnée n'est pas standard => On la conserve
  if (   t->Color != PROG_COL_EDIT                && t->Color != PROG_COL_OBLIGATOIRE
      && t->Color != PROG_COL_DISABLED)
   CouleurFond = t->Color;
  else
  {
    if(!t->Enabled || t->ReadOnly)
      CouleurFond = PROG_COL_DISABLED;
    else
      CouleurFond = PROG_COL_EDIT;
  }

if (   t->ClassNameIs("CDBComboBox")
    || t->ClassNameIs("CDBListBox")
    || t->ClassNameIs("CDBMemo")
    || t->ClassNameIs("CDBEdit")
    || t->ClassNameIs("CRichEdit"))
   t->Color = CouleurFond;   //Moins propre que l'affectation du Brush, mais les composants DB ou dérivant du TCustomMemo se redessinent tout seul lorsque l'enregistrement change
else
   t->Brush->Color = CouleurFond;
t->Repaint();
}

#endif
